টাইপস্ক্রিপ্ট দিয়ে আপনার Express.js অ্যাপ্লিকেশনে শক্তিশালী টাইপ সেফটি যোগ করুন। এই গাইডে রুট হ্যান্ডলার, মিডলওয়্যার টাইপিং এবং স্কেলেবল ও রক্ষণাবেক্ষণযোগ্য এপিআই তৈরির সেরা অনুশীলনগুলো রয়েছে।
টাইপস্ক্রিপ্ট এক্সপ্রেস ইন্টিগ্রেশন: রুট হ্যান্ডলার টাইপ সেফটি
টাইপস্ক্রিপ্ট আধুনিক জাভাস্ক্রিপ্ট ডেভেলপমেন্টের একটি ভিত্তিপ্রস্তর হয়ে উঠেছে, যা স্ট্যাটিক টাইপিং ক্ষমতা প্রদান করে যা কোডের গুণমান, রক্ষণাবেক্ষণযোগ্যতা এবং পরিমাপযোগ্যতা বাড়ায়। যখন Express.js, একটি জনপ্রিয় Node.js ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্কের সাথে মিলিত হয়, তখন টাইপস্ক্রিপ্ট আপনার ব্যাকএন্ড এপিআই-এর দৃঢ়তা উল্লেখযোগ্যভাবে উন্নত করতে পারে। এই বিস্তারিত নির্দেশিকাটি Express.js অ্যাপ্লিকেশনগুলিতে রুট হ্যান্ডলার টাইপ সেফটি অর্জনের জন্য টাইপস্ক্রিপ্ট কীভাবে ব্যবহার করতে হয় তা অন্বেষণ করে, এবং বিশ্বব্যাপী দর্শকদের জন্য শক্তিশালী এবং রক্ষণাবেক্ষণযোগ্য এপিআই তৈরির জন্য ব্যবহারিক উদাহরণ এবং সেরা অনুশীলনগুলো সরবরাহ করে।
Express.js-এ টাইপ সেফটি কেন গুরুত্বপূর্ণ
জাভাস্ক্রিপ্টের মতো ডাইনামিক ভাষাগুলিতে, ত্রুটিগুলি প্রায়শই রানটাইমে ধরা পড়ে, যা অপ্রত্যাশিত আচরণ এবং ডিবাগ করতে কঠিন সমস্যার কারণ হতে পারে। টাইপস্ক্রিপ্ট স্ট্যাটিক টাইপিং চালু করে এই সমস্যার সমাধান করে, যা আপনাকে প্রোডাকশনে যাওয়ার আগেই ডেভেলপমেন্টের সময় ত্রুটিগুলি ধরতে দেয়। Express.js-এর প্রেক্ষাপটে, রুট হ্যান্ডলারগুলির জন্য টাইপ সেফটি বিশেষভাবে গুরুত্বপূর্ণ, যেখানে আপনি রিকোয়েস্ট এবং রেসপন্স অবজেক্ট, কোয়েরি প্যারামিটার এবং রিকোয়েস্ট বডি নিয়ে কাজ করেন। এই উপাদানগুলির ভুল পরিচালনা অ্যাপ্লিকেশন ক্র্যাশ, ডেটা দুর্নীতি এবং নিরাপত্তা দুর্বলতার কারণ হতে পারে।
- ত্রুটি দ্রুত শনাক্তকরণ: ডেভেলপমেন্টের সময় টাইপ-সম্পর্কিত ত্রুটিগুলি ধরুন, রানটাইম অপ্রত্যাশিত ঘটনার সম্ভাবনা হ্রাস করুন।
- কোডের উন্নত রক্ষণাবেক্ষণযোগ্যতা: টাইপ অ্যানোটেশন কোড বোঝা এবং রিফ্যাক্টর করা সহজ করে।
- উন্নত কোড কমপ্লিশন এবং টুলিং: আইডিইগুলো টাইপ তথ্যের সাহায্যে আরও ভালো সাজেশন এবং ত্রুটি পরীক্ষা করতে পারে।
- বাগ হ্রাস: টাইপ সেফটি সাধারণ প্রোগ্রামিং ত্রুটিগুলি প্রতিরোধ করতে সহায়তা করে, যেমন ফাংশনে ভুল ডেটা টাইপ পাস করা।
একটি টাইপস্ক্রিপ্ট Express.js প্রজেক্ট সেট আপ করা
রুট হ্যান্ডলার টাইপ সেফটিতে প্রবেশ করার আগে, আসুন একটি বেসিক টাইপস্ক্রিপ্ট Express.js প্রজেক্ট সেট আপ করি। এটি আমাদের উদাহরণগুলির ভিত্তি হিসেবে কাজ করবে।
পূর্বশর্ত
- Node.js এবং npm (নোড প্যাকেজ ম্যানেজার) ইনস্টল থাকতে হবে। আপনি অফিসিয়াল Node.js ওয়েবসাইট থেকে সেগুলি ডাউনলোড করতে পারেন। সর্বোত্তম সামঞ্জস্যের জন্য আপনার একটি সাম্প্রতিক সংস্করণ রয়েছে তা নিশ্চিত করুন।
- ভিজ্যুয়াল স্টুডিও কোডের মতো একটি কোড এডিটর, যা চমৎকার টাইপস্ক্রিপ্ট সমর্থন প্রদান করে।
প্রজেক্ট শুরু করা
- একটি নতুন প্রজেক্ট ডিরেক্টরি তৈরি করুন:
mkdir typescript-express-app && cd typescript-express-app - একটি নতুন npm প্রজেক্ট শুরু করুন:
npm init -y - টাইপস্ক্রিপ্ট এবং Express.js ইনস্টল করুন:
npm install typescript express - Express.js-এর জন্য টাইপস্ক্রিপ্ট ডিক্লারেশন ফাইল ইনস্টল করুন (টাইপ সেফটির জন্য গুরুত্বপূর্ণ):
npm install @types/express @types/node - টাইপস্ক্রিপ্ট শুরু করুন:
npx tsc --init(এটি একটিtsconfig.jsonফাইল তৈরি করে, যা টাইপস্ক্রিপ্ট কম্পাইলার কনফিগার করে।)
টাইপস্ক্রিপ্ট কনফিগার করা
tsconfig.json ফাইলটি খুলুন এবং এটি যথাযথভাবে কনফিগার করুন। এখানে একটি নমুনা কনফিগারেশন দেওয়া হলো:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
লক্ষ্য করার মতো মূল কনফিগারেশনগুলো:
target: ECMAScript টার্গেট সংস্করণ নির্দিষ্ট করে।es6একটি ভালো সূচনা বিন্দু।module: মডিউল কোড জেনারেশন নির্দিষ্ট করে।commonjsNode.js-এর জন্য একটি সাধারণ পছন্দ।outDir: কম্পাইল করা জাভাস্ক্রিপ্ট ফাইলগুলির জন্য আউটপুট ডিরেক্টরি নির্দিষ্ট করে।rootDir: আপনার টাইপস্ক্রিপ্ট সোর্স ফাইলগুলির রুট ডিরেক্টরি নির্দিষ্ট করে।strict: উন্নত টাইপ সেফটির জন্য সমস্ত কঠোর টাইপ-চেকিং বিকল্প সক্রিয় করে। এটি অত্যন্ত সুপারিশ করা হয়।esModuleInterop: CommonJS এবং ES মডিউলগুলির মধ্যে আন্তঃক্রিয়া সক্ষম করে।
এন্ট্রি পয়েন্ট তৈরি করা
একটি src ডিরেক্টরি তৈরি করুন এবং একটি index.ts ফাইল যোগ করুন:
mkdir src
touch src/index.ts
একটি বেসিক Express.js সার্ভার সেটআপ দিয়ে src/index.ts ফাইলটি পূরণ করুন:
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
app.get('/', (req: Request, res: Response) => {
res.send('Hello, TypeScript Express!');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
একটি বিল্ড স্ক্রিপ্ট যোগ করা
টাইপস্ক্রিপ্ট কোড কম্পাইল করার জন্য আপনার package.json ফাইলে একটি বিল্ড স্ক্রিপ্ট যোগ করুন:
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "npm run build && npm run start"
}
এখন আপনি সার্ভার বিল্ড এবং স্টার্ট করতে npm run dev চালাতে পারেন।
রুট হ্যান্ডলার টাইপ সেফটি: রিকোয়েস্ট এবং রেসপন্স টাইপ সংজ্ঞায়িত করা
রুট হ্যান্ডলার টাইপ সেফটির মূল ভিত্তি হলো Request এবং Response অবজেক্টগুলির জন্য সঠিকভাবে টাইপ সংজ্ঞায়িত করা। Express.js এই অবজেক্টগুলির জন্য জেনেরিক টাইপ সরবরাহ করে যা আপনাকে কোয়েরি প্যারামিটার, রিকোয়েস্ট বডি এবং রুট প্যারামিটারের টাইপ নির্দিষ্ট করতে দেয়।
বেসিক রুট হ্যান্ডলার টাইপ
আসুন একটি সাধারণ রুট হ্যান্ডলার দিয়ে শুরু করি যা কোয়েরি প্যারামিটার হিসাবে একটি নাম আশা করে:
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
interface NameQuery {
name: string;
}
app.get('/hello', (req: Request, res: Response) => {
const name = req.query.name;
if (!name) {
return res.status(400).send('Name parameter is required.');
}
res.send(`Hello, ${name}!`);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
Request<any, any, any, NameQuery>রিকোয়েস্ট অবজেক্টের জন্য টাইপ সংজ্ঞায়িত করে।- প্রথম
anyরুট প্যারামিটার প্রতিনিধিত্ব করে (যেমন,/users/:id)। - দ্বিতীয়
anyরেসপন্স বডি টাইপ প্রতিনিধিত্ব করে। - তৃতীয়
anyরিকোয়েস্ট বডি টাইপ প্রতিনিধিত্ব করে। NameQueryএকটি ইন্টারফেস যা কোয়েরি প্যারামিটারের গঠন সংজ্ঞায়িত করে।
NameQuery ইন্টারফেস সংজ্ঞায়িত করার মাধ্যমে, টাইপস্ক্রিপ্ট এখন যাচাই করতে পারে যে req.query.name প্রপার্টি বিদ্যমান এবং এটি string টাইপের। আপনি যদি একটি অস্তিত্বহীন প্রপার্টি অ্যাক্সেস করার চেষ্টা করেন বা ভুল টাইপের মান নির্ধারণ করেন, টাইপস্ক্রিপ্ট একটি ত্রুটি দেখাবে।
রিকোয়েস্ট বডি হ্যান্ডলিং
যে রুটগুলি রিকোয়েস্ট বডি গ্রহণ করে (যেমন, POST, PUT, PATCH), সেগুলির জন্য আপনি রিকোয়েস্ট বডির জন্য একটি ইন্টারফেস সংজ্ঞায়িত করতে পারেন এবং এটি Request টাইপে ব্যবহার করতে পারেন:
import express, { Request, Response } from 'express';
import bodyParser from 'body-parser';
const app = express();
const port = 3000;
app.use(bodyParser.json()); // JSON request bodies পার্স করার জন্য গুরুত্বপূর্ণ
interface CreateUserRequest {
firstName: string;
lastName: string;
email: string;
}
app.post('/users', (req: Request, res: Response) => {
const { firstName, lastName, email } = req.body;
// Validate the request body
if (!firstName || !lastName || !email) {
return res.status(400).send('Missing required fields.');
}
// Process the user creation (e.g., save to database)
console.log(`Creating user: ${firstName} ${lastName} (${email})`);
res.status(201).send('User created successfully.');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
CreateUserRequestপ্রত্যাশিত রিকোয়েস্ট বডির গঠন সংজ্ঞায়িত করে।app.use(bodyParser.json())JSON রিকোয়েস্ট বডি পার্স করার জন্য অত্যন্ত গুরুত্বপূর্ণ। এটি ছাড়া,req.bodyআনডিফাইন্ড থাকবে।Requestটাইপটি এখনRequest<any, any, CreateUserRequest>, যা নির্দেশ করে যে রিকোয়েস্ট বডিটিCreateUserRequestইন্টারফেসের সাথে সঙ্গতিপূর্ণ হওয়া উচিত।
টাইপস্ক্রিপ্ট এখন নিশ্চিত করবে যে req.body অবজেক্টে প্রত্যাশিত প্রপার্টি (firstName, lastName, এবং email) রয়েছে এবং তাদের টাইপ সঠিক। এটি ভুল রিকোয়েস্ট বডি ডেটার কারণে রানটাইম ত্রুটির ঝুঁকি উল্লেখযোগ্যভাবে হ্রাস করে।
রুট প্যারামিটার হ্যান্ডলিং
প্যারামিটার সহ রুটের জন্য (যেমন, /users/:id), আপনি রুট প্যারামিটারগুলির জন্য একটি ইন্টারফেস সংজ্ঞায়িত করতে পারেন এবং এটি Request টাইপে ব্যবহার করতে পারেন:
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
interface UserParams {
id: string;
}
interface User {
id: string;
firstName: string;
lastName: string;
email: string;
}
const users: User[] = [
{ id: '1', firstName: 'John', lastName: 'Doe', email: 'john.doe@example.com' },
{ id: '2', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@example.com' },
];
app.get('/users/:id', (req: Request, res: Response) => {
const userId = req.params.id;
const user = users.find(u => u.id === userId);
if (!user) {
return res.status(404).send('User not found.');
}
res.json(user);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
UserParamsরুট প্যারামিটারগুলির গঠন সংজ্ঞায়িত করে, নির্দিষ্ট করে যেidপ্যারামিটারটি একটি স্ট্রিং হওয়া উচিত।Requestটাইপটি এখনRequest<UserParams>, যা নির্দেশ করে যেreq.paramsঅবজেক্টটিUserParamsইন্টারফেসের সাথে সঙ্গতিপূর্ণ হওয়া উচিত।
টাইপস্ক্রিপ্ট এখন নিশ্চিত করবে যে req.params.id প্রপার্টি বিদ্যমান এবং এটি string টাইপের। এটি অস্তিত্বহীন রুট প্যারামিটার অ্যাক্সেস করা বা ভুল টাইপ দিয়ে ব্যবহার করার কারণে সৃষ্ট ত্রুটি প্রতিরোধ করতে সহায়তা করে।
রেসপন্স টাইপ নির্দিষ্ট করা
রিকোয়েস্ট টাইপ সেফটির উপর মনোযোগ দেওয়া গুরুত্বপূর্ণ হলেও, রেসপন্স টাইপ সংজ্ঞায়িত করা কোডের স্বচ্ছতা বাড়ায় এবং অসামঞ্জস্যতা প্রতিরোধ করতে সহায়তা করে। আপনি রেসপন্সে যে ডেটা পাঠাচ্ছেন তার টাইপ সংজ্ঞায়িত করতে পারেন।
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
interface User {
id: string;
firstName: string;
lastName: string;
email: string;
}
const users: User[] = [
{ id: '1', firstName: 'John', lastName: 'Doe', email: 'john.doe@example.com' },
{ id: '2', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@example.com' },
];
app.get('/users', (req: Request, res: Response) => {
res.json(users);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে, Response<User[]> নির্দিষ্ট করে যে রেসপন্স বডিটি User অবজেক্টের একটি অ্যারে হওয়া উচিত। এটি নিশ্চিত করতে সাহায্য করে যে আপনি আপনার এপিআই রেসপন্সে ধারাবাহিকভাবে সঠিক ডেটা কাঠামো পাঠাচ্ছেন। আপনি যদি এমন ডেটা পাঠানোর চেষ্টা করেন যা `User[]` টাইপের সাথে সঙ্গতিপূর্ণ নয়, টাইপস্ক্রিপ্ট একটি সতর্কবার্তা দেবে।
মিডলওয়্যার টাইপ সেফটি
Express.js অ্যাপ্লিকেশনগুলিতে ক্রস-কাটিং কনসার্নগুলি পরিচালনা করার জন্য মিডলওয়্যার ফাংশনগুলি অপরিহার্য। মিডলওয়্যারে টাইপ সেফটি নিশ্চিত করা রুট হ্যান্ডলারগুলির মতোই গুরুত্বপূর্ণ।
মিডলওয়্যার ফাংশন টাইপিং
টাইপস্ক্রিপ্টে একটি মিডলওয়্যার ফাংশনের বেসিক কাঠামো একটি রুট হ্যান্ডলারের মতোই:
import express, { Request, Response, NextFunction } from 'express';
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// Authentication logic
const isAuthenticated = true; // Replace with actual authentication check
if (isAuthenticated) {
next(); // Proceed to the next middleware or route handler
} else {
res.status(401).send('Unauthorized');
}
}
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/', (req: Request, res: Response) => {
res.send('Hello, authenticated user!');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
NextFunctionExpress.js দ্বারা প্রদত্ত একটি টাইপ যা চেইনের পরবর্তী মিডলওয়্যার ফাংশনকে প্রতিনিধিত্ব করে।- মিডলওয়্যার ফাংশনটি রুট হ্যান্ডলারগুলির মতোই
RequestএবংResponseঅবজেক্ট গ্রহণ করে।
রিকোয়েস্ট অবজেক্ট অগমেন্ট করা
কখনও কখনও, আপনি আপনার মিডলওয়্যারে Request অবজেক্টে কাস্টম প্রপার্টি যোগ করতে চাইতে পারেন। উদাহরণস্বরূপ, একটি প্রমাণীকরণ মিডলওয়্যার রিকোয়েস্ট অবজেক্টে একটি user প্রপার্টি যোগ করতে পারে। এটি একটি টাইপ-সেফ উপায়ে করার জন্য, আপনাকে Request ইন্টারফেসটি অগমেন্ট করতে হবে।
import express, { Request, Response, NextFunction } from 'express';
interface User {
id: string;
username: string;
email: string;
}
// Augment the Request interface
declare global {
namespace Express {
interface Request {
user?: User;
}
}
}
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// Authentication logic (replace with actual authentication check)
const user: User = { id: '123', username: 'johndoe', email: 'john.doe@example.com' };
req.user = user; // Add the user to the request object
next(); // Proceed to the next middleware or route handler
}
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/', (req: Request, res: Response) => {
const username = req.user?.username || 'Guest';
res.send(`Hello, ${username}!`);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
- আমরা
Express.Requestইন্টারফেসটি অগমেন্ট করার জন্য একটি গ্লোবাল ডিক্লারেশন ব্যবহার করি। - আমরা
Requestইন্টারফেসেUserটাইপের একটি ঐচ্ছিকuserপ্রপার্টি যোগ করি। - এখন, আপনি টাইপস্ক্রিপ্টের অভিযোগ ছাড়াই আপনার রুট হ্যান্ডলারগুলিতে
req.userপ্রপার্টি অ্যাক্সেস করতে পারেন।req.user?.username-এর `?` চিহ্নটি এমন ক্ষেত্রে গুরুত্বপূর্ণ যেখানে ব্যবহারকারী প্রমাণীকৃত নয়, যা সম্ভাব্য ত্রুটি প্রতিরোধ করে।
টাইপস্ক্রিপ্ট এক্সপ্রেস ইন্টিগ্রেশনের জন্য সেরা অনুশীলন
আপনার Express.js অ্যাপ্লিকেশনগুলিতে টাইপস্ক্রিপ্টের সুবিধাগুলি সর্বাধিক করার জন্য, এই সেরা অনুশীলনগুলি অনুসরণ করুন:
- স্ট্রিক্ট মোড সক্রিয় করুন: সমস্ত কঠোর টাইপ-চেকিং বিকল্প সক্রিয় করতে আপনার
tsconfig.jsonফাইলে"strict": trueবিকল্পটি ব্যবহার করুন। এটি সম্ভাব্য ত্রুটিগুলি তাড়াতাড়ি ধরতে সাহায্য করে এবং উচ্চ স্তরের টাইপ সেফটি নিশ্চিত করে। - ইন্টারফেস এবং টাইপ অ্যালিয়াস ব্যবহার করুন: আপনার ডেটার কাঠামো প্রতিনিধিত্ব করার জন্য ইন্টারফেস এবং টাইপ অ্যালিয়াস সংজ্ঞায়িত করুন। এটি আপনার কোডকে আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
- জেনেরিক টাইপ ব্যবহার করুন: পুনরায় ব্যবহারযোগ্য এবং টাইপ-সেফ কম্পোনেন্ট তৈরি করতে জেনেরিক টাইপ ব্যবহার করুন।
- ইউনিট টেস্ট লিখুন: আপনার কোডের সঠিকতা যাচাই করতে এবং আপনার টাইপ অ্যানোটেশনগুলি সঠিক কিনা তা নিশ্চিত করতে ইউনিট টেস্ট লিখুন। কোডের গুণমান বজায় রাখার জন্য টেস্টিং অত্যন্ত গুরুত্বপূর্ণ।
- একটি লিন্টার এবং ফরম্যাটার ব্যবহার করুন: একটি লিন্টার (যেমন ESLint) এবং একটি ফরম্যাটার (যেমন Prettier) ব্যবহার করুন যাতে সামঞ্জস্যপূর্ণ কোডিং শৈলী প্রয়োগ করা যায় এবং সম্ভাব্য ত্রুটিগুলি ধরা যায়।
anyটাইপ এড়িয়ে চলুন:anyটাইপের ব্যবহার হ্রাস করুন, কারণ এটি টাইপ চেকিং বাইপাস করে এবং টাইপস্ক্রিপ্ট ব্যবহারের উদ্দেশ্যকে ব্যর্থ করে। শুধুমাত্র যখন একেবারে প্রয়োজন হয় তখন এটি ব্যবহার করুন, এবং যখনই সম্ভব আরও নির্দিষ্ট টাইপ বা জেনেরিক ব্যবহার করার কথা বিবেচনা করুন।- আপনার প্রজেক্টকে যৌক্তিকভাবে গঠন করুন: কার্যকারিতার উপর ভিত্তি করে আপনার প্রজেক্টকে মডিউল বা ফোল্ডারে সংগঠিত করুন। এটি আপনার অ্যাপ্লিকেশনের রক্ষণাবেক্ষণযোগ্যতা এবং পরিমাপযোগ্যতা উন্নত করবে।
- ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করুন: আপনার অ্যাপ্লিকেশনের নির্ভরতা পরিচালনা করতে একটি ডিপেন্ডেন্সি ইনজেকশন কন্টেইনার ব্যবহার করার কথা বিবেচনা করুন। এটি আপনার কোডকে আরও পরীক্ষামূলক এবং রক্ষণাবেক্ষণযোগ্য করে তুলতে পারে। InversifyJS-এর মতো লাইব্রেরিগুলি জনপ্রিয় পছন্দ।
Express.js-এর জন্য অ্যাডভান্সড টাইপস্ক্রিপ্ট কনসেপ্ট
ডেকোরেটর ব্যবহার করা
ডেকোরেটরগুলি ক্লাস এবং ফাংশনে মেটাডেটা যোগ করার জন্য একটি সংক্ষিপ্ত এবং অভিব্যক্তিপূর্ণ উপায় সরবরাহ করে। আপনি Express.js-এ রুট রেজিস্ট্রেশন সহজ করার জন্য ডেকোরেটর ব্যবহার করতে পারেন।
প্রথমে, আপনাকে আপনার tsconfig.json ফাইলে "experimentalDecorators": true যোগ করে পরীক্ষামূলক ডেকোরেটরগুলি সক্ষম করতে হবে।
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"experimentalDecorators": true
}
}
তারপর, আপনি রুট রেজিস্টার করার জন্য একটি কাস্টম ডেকোরেটর তৈরি করতে পারেন:
import express, { Router, Request, Response } from 'express';
function route(method: string, path: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
if (!target.__router__) {
target.__router__ = Router();
}
target.__router__[method](path, descriptor.value);
};
}
class UserController {
@route('get', '/users')
getUsers(req: Request, res: Response) {
res.send('List of users');
}
@route('post', '/users')
createUser(req: Request, res: Response) {
res.status(201).send('User created');
}
public getRouter() {
return this.__router__;
}
}
const userController = new UserController();
const app = express();
const port = 3000;
app.use('/', userController.getRouter());
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
routeডেকোরেটরটি HTTP মেথড এবং পাথ আর্গুমেন্ট হিসাবে নেয়।- এটি ডেকোরেটেড মেথডটিকে ক্লাসের সাথে যুক্ত রাউটারে একটি রুট হ্যান্ডলার হিসাবে রেজিস্টার করে।
- এটি রুট রেজিস্ট্রেশন সহজ করে এবং আপনার কোডকে আরও পঠনযোগ্য করে তোলে।
কাস্টম টাইপ গার্ড ব্যবহার করা
টাইপ গার্ড হলো এমন ফাংশন যা একটি নির্দিষ্ট স্কোপের মধ্যে একটি ভেরিয়েবলের টাইপকে সংকুচিত করে। আপনি রিকোয়েস্ট বডি বা কোয়েরি প্যারামিটার যাচাই করতে কাস্টম টাইপ গার্ড ব্যবহার করতে পারেন।
interface Product {
id: string;
name: string;
price: number;
}
function isProduct(obj: any): obj is Product {
return typeof obj === 'object' &&
obj !== null &&
typeof obj.id === 'string' &&
typeof obj.name === 'string' &&
typeof obj.price === 'number';
}
import express, { Request, Response } from 'express';
import bodyParser from 'body-parser';
const app = express();
const port = 3000;
app.use(bodyParser.json());
app.post('/products', (req: Request, res: Response) => {
if (!isProduct(req.body)) {
return res.status(400).send('Invalid product data');
}
const product: Product = req.body;
console.log(`Creating product: ${product.name}`);
res.status(201).send('Product created');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এই উদাহরণে:
isProductফাংশনটি একটি কাস্টম টাইপ গার্ড যা একটি অবজেক্টProductইন্টারফেসের সাথে সঙ্গতিপূর্ণ কিনা তা পরীক্ষা করে।/productsরুট হ্যান্ডলারের ভিতরে,isProductফাংশনটি রিকোয়েস্ট বডি যাচাই করতে ব্যবহৃত হয়।- যদি রিকোয়েস্ট বডিটি একটি বৈধ প্রোডাক্ট হয়, টাইপস্ক্রিপ্ট জানে যে
ifব্লকের মধ্যেreq.body-এর টাইপProduct।
এপিআই ডিজাইনে বৈশ্বিক বিবেচনা
বিশ্বব্যাপী দর্শকদের জন্য এপিআই ডিজাইন করার সময়, অ্যাক্সেসিবিলিটি, ব্যবহারযোগ্যতা এবং সাংস্কৃতিক সংবেদনশীলতা নিশ্চিত করতে বেশ কিছু বিষয় বিবেচনা করা উচিত।
- লোকালাইজেশন এবং ইন্টারন্যাশনালাইজেশন (i18n এবং L10n):
- কন্টেন্ট নেগোসিয়েশন:
Accept-Languageহেডারের উপর ভিত্তি করে কন্টেন্ট নেগোসিয়েশনের মাধ্যমে একাধিক ভাষা এবং অঞ্চল সমর্থন করুন। - তারিখ এবং সময় ফরম্যাটিং: বিভিন্ন অঞ্চলে অস্পষ্টতা এড়াতে তারিখ এবং সময় উপস্থাপনের জন্য ISO 8601 ফরম্যাট ব্যবহার করুন।
- সংখ্যা ফরম্যাটিং: ব্যবহারকারীর লোকেল অনুযায়ী সংখ্যা ফরম্যাটিং পরিচালনা করুন (যেমন, দশমিক বিভাজক এবং হাজার বিভাজক)।
- মুদ্রা হ্যান্ডলিং: একাধিক মুদ্রা সমর্থন করুন এবং প্রয়োজনে বিনিময় হারের তথ্য সরবরাহ করুন।
- টেক্সট ডিরেকশন: আরবি এবং হিব্রুর মতো ডান-থেকে-বামে (RTL) ভাষাগুলিকে সমর্থন করুন।
- কন্টেন্ট নেগোসিয়েশন:
- টাইম জোন:
- সার্ভার সাইডে UTC (সমন্বিত সার্বজনীন সময়)-তে তারিখ এবং সময় সংরক্ষণ করুন।
- ব্যবহারকারীদের তাদের পছন্দের টাইম জোন নির্দিষ্ট করতে দিন এবং ক্লায়েন্ট সাইডে সেই অনুযায়ী তারিখ এবং সময় রূপান্তর করুন।
- টাইম জোন রূপান্তর পরিচালনা করতে
moment-timezone-এর মতো লাইব্রেরি ব্যবহার করুন।
- ক্যারেক্টার এনকোডিং:
- বিভিন্ন ভাষার বিস্তৃত অক্ষর সমর্থন করার জন্য সমস্ত টেক্সট ডেটার জন্য UTF-8 এনকোডিং ব্যবহার করুন।
- নিশ্চিত করুন যে আপনার ডাটাবেস এবং অন্যান্য ডেটা স্টোরেজ সিস্টেমগুলি UTF-8 ব্যবহার করার জন্য কনফিগার করা হয়েছে।
- অ্যাক্সেসিবিলিটি:
- আপনার এপিআই প্রতিবন্ধী ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য করতে অ্যাক্সেসিবিলিটি নির্দেশিকা (যেমন, WCAG) অনুসরণ করুন।
- পরিষ্কার এবং বর্ণনামূলক ত্রুটি বার্তা প্রদান করুন যা বোঝা সহজ।
- আপনার এপিআই ডকুমেন্টেশনে সেমান্টিক HTML এলিমেন্ট এবং ARIA অ্যাট্রিবিউট ব্যবহার করুন।
- সাংস্কৃতিক সংবেদনশীলতা:
- সাংস্কৃতিক নির্দিষ্ট রেফারেন্স, ইডিয়ম বা হাস্যরস ব্যবহার করা থেকে বিরত থাকুন যা সব ব্যবহারকারী বুঝতে নাও পারে।
- যোগাযোগ শৈলী এবং পছন্দগুলিতে সাংস্কৃতিক পার্থক্য সম্পর্কে সচেতন থাকুন।
- বিভিন্ন সাংস্কৃতিক গোষ্ঠীর উপর আপনার এপিআই-এর সম্ভাব্য প্রভাব বিবেচনা করুন এবং স্টেরিওটাইপ বা পক্ষপাতিত্ব প্রচার করা থেকে বিরত থাকুন।
- ডেটা গোপনীয়তা এবং নিরাপত্তা:
- GDPR (সাধারণ ডেটা সুরক্ষা নিয়ন্ত্রণ) এবং CCPA (ক্যালিফোর্নিয়া উপভোক্তা গোপনীয়তা আইন) এর মতো ডেটা গোপনীয়তা নিয়ম মেনে চলুন।
- ব্যবহারকারীর ডেটা সুরক্ষিত রাখতে শক্তিশালী প্রমাণীকরণ এবং অনুমোদন ব্যবস্থা বাস্তবায়ন করুন।
- ট্রানজিটে এবং বিশ্রামে উভয় অবস্থায় সংবেদনশীল ডেটা এনক্রিপ্ট করুন।
- ব্যবহারকারীদের তাদের ডেটার উপর নিয়ন্ত্রণ প্রদান করুন এবং তাদের ডেটা অ্যাক্সেস, পরিবর্তন এবং মুছে ফেলার অনুমতি দিন।
- এপিআই ডকুমেন্টেশন:
- বিস্তৃত এবং সুসংগঠিত এপিআই ডকুমেন্টেশন প্রদান করুন যা বোঝা এবং নেভিগেট করা সহজ।
- ইন্টারেক্টিভ এপিআই ডকুমেন্টেশন তৈরি করতে Swagger/OpenAPI-এর মতো টুল ব্যবহার করুন।
- বিভিন্ন দর্শকদের জন্য একাধিক প্রোগ্রামিং ভাষায় কোড উদাহরণ অন্তর্ভুক্ত করুন।
- একটি বৃহত্তর দর্শকদের কাছে পৌঁছানোর জন্য আপনার এপিআই ডকুমেন্টেশন একাধিক ভাষায় অনুবাদ করুন।
- ত্রুটি হ্যান্ডলিং:
- নির্দিষ্ট এবং তথ্যপূর্ণ ত্রুটি বার্তা প্রদান করুন। "Something went wrong" এর মতো জেনেরিক ত্রুটি বার্তা এড়িয়ে চলুন।
- ত্রুটির ধরন নির্দেশ করতে স্ট্যান্ডার্ড HTTP স্ট্যাটাস কোড ব্যবহার করুন (যেমন, 400 ব্যাড রিকোয়েস্টের জন্য, 401 অননুমোদিত জন্য, 500 ইন্টারনাল সার্ভার ত্রুটির জন্য)।
- ত্রুটি কোড বা শনাক্তকারী অন্তর্ভুক্ত করুন যা সমস্যা ট্র্যাক এবং ডিবাগ করতে ব্যবহার করা যেতে পারে।
- ডিবাগিং এবং পর্যবেক্ষণের জন্য সার্ভার সাইডে ত্রুটি লগ করুন।
- রেট লিমিটিং: আপনার এপিআইকে অপব্যবহার থেকে রক্ষা করতে এবং ন্যায্য ব্যবহার নিশ্চিত করতে রেট লিমিটিং প্রয়োগ করুন।
- ভার্সনিং: পশ্চাৎ-সামঞ্জস্যপূর্ণ পরিবর্তনগুলির অনুমতি দিতে এবং বিদ্যমান ক্লায়েন্টদের ভাঙা এড়াতে এপিআই ভার্সনিং ব্যবহার করুন।
উপসংহার
টাইপস্ক্রিপ্ট এক্সপ্রেস ইন্টিগ্রেশন আপনার ব্যাকএন্ড এপিআই-এর নির্ভরযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উল্লেখযোগ্যভাবে উন্নত করে। রুট হ্যান্ডলার এবং মিডলওয়্যারে টাইপ সেফটি ব্যবহার করে, আপনি ডেভেলপমেন্ট প্রক্রিয়ার প্রথম দিকে ত্রুটিগুলি ধরতে পারেন এবং বিশ্বব্যাপী দর্শকদের জন্য আরও শক্তিশালী এবং পরিমাপযোগ্য অ্যাপ্লিকেশন তৈরি করতে পারেন। রিকোয়েস্ট এবং রেসপন্স টাইপ সংজ্ঞায়িত করে, আপনি নিশ্চিত করেন যে আপনার এপিআই একটি সামঞ্জস্যপূর্ণ ডেটা কাঠামো মেনে চলে, যা রানটাইম ত্রুটির সম্ভাবনা হ্রাস করে। টাইপস্ক্রিপ্টের সুবিধাগুলি সর্বাধিক করার জন্য স্ট্রিক্ট মোড সক্রিয় করা, ইন্টারফেস এবং টাইপ অ্যালিয়াস ব্যবহার করা এবং ইউনিট টেস্ট লেখার মতো সেরা অনুশীলনগুলি মেনে চলতে ভুলবেন না। আপনার এপিআইগুলি বিশ্বব্যাপী অ্যাক্সেসযোগ্য এবং ব্যবহারযোগ্য তা নিশ্চিত করতে সর্বদা লোকালাইজেশন, টাইম জোন এবং সাংস্কৃতিক সংবেদনশীলতার মতো বৈশ্বিক বিষয়গুলি বিবেচনা করুন।